API: Add gtk_test_widget_wait_for_draw ()
authorBenjamin Otte <otte@redhat.com>
Thu, 16 May 2013 23:35:04 +0000 (01:35 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 17 May 2013 18:49:52 +0000 (20:49 +0200)
See docs and following commits for what it's supposed to do. Let's hope
it fixes the flakiness in tests.

gtk/gtktestutils.c
gtk/gtktestutils.h

index c41c8920c43c720f2ff736904deea41859d46a15..0b3831d6c08920f254d500a301a119ca6d9bf770 100644 (file)
@@ -116,6 +116,45 @@ test_find_widget_input_windows (GtkWidget *widget,
   return g_slist_reverse (matches);
 }
 
+static gboolean
+quit_main_loop_callback (GtkWidget     *widget,
+                         GdkFrameClock *frame_clock,
+                         gpointer       user_data)
+{
+  gtk_main_quit ();
+
+  return G_SOURCE_REMOVE;
+}
+
+/**
+ * gtk_test_widget_wait_for_draw:
+ * @widget: the widget to wait for
+ *
+ * Enters the main loop and waits for @widget to be "drawn". In this
+ * context that means it waits for the frame clock of @widget to have
+ * run a full styling, layout and drawing cycle.
+ *
+ * This function is intended to be used for syncing with actions that
+ * depend on @widget relayouting or on interaction with the display
+ * server.
+ **/
+void
+gtk_test_widget_wait_for_draw (GtkWidget *widget)
+{
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  /* We can do this here because the whole tick procedure does not
+   * reenter the main loop. Otherwise we'd need to manually get the
+   * frame clock and connect to the after-paint signal.
+   */
+  gtk_widget_add_tick_callback (widget,
+                                quit_main_loop_callback,
+                                NULL,
+                                NULL);
+
+  gtk_main ();
+}
+
 /**
  * gtk_test_widget_send_key:
  * @widget: Widget to generate a key press and release on.
index d382dea2c9e5cd5e87d5fad0fea933d89e974fb1..badbd1f372df37418dfe0a208e0f9898adcebeb6 100644 (file)
@@ -61,6 +61,8 @@ GDK_AVAILABLE_IN_ALL
 gboolean        gtk_test_spin_button_click      (GtkSpinButton  *spinner,
                                                  guint           button,
                                                  gboolean        upwards);
+GDK_AVAILABLE_IN_3_10
+void            gtk_test_widget_wait_for_draw   (GtkWidget      *widget);
 GDK_AVAILABLE_IN_ALL
 gboolean        gtk_test_widget_click           (GtkWidget      *widget,
                                                  guint           button,